places-view: monitor network
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Mon, 10 Apr 2017 21:59:33 +0000 (18:59 -0300)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Mon, 10 Apr 2017 22:36:02 +0000 (19:36 -0300)
GtkPlacesView exposes local access points and network
shares transparently by using the 'network:///' URI,
which is handled by GIO.

Currently, however, it doesn't monitor the network
for new available points, such as computers that just
join the network. It may happen too that the backend
won't find all the networks before the network enumeration
finishes.

Fix that by keeping a file monitor inspecting the network
uri, and update the places list when that happens.

https://bugzilla.gnome.org/show_bug.cgi?id=781162

gtk/gtkplacesview.c

index 7d4a6ddf14aec5ec18b8c40d70aeef790f882551..12b556873c1ba3874c787d48cb271525b1e7eafe 100644 (file)
@@ -56,6 +56,7 @@ struct _GtkPlacesViewPrivate
 
   GFile                         *server_list_file;
   GFileMonitor                  *server_list_monitor;
+  GFileMonitor                  *network_monitor;
 
   GCancellable                  *cancellable;
 
@@ -397,6 +398,7 @@ gtk_places_view_destroy (GtkWidget *widget)
   priv->destroyed = 1;
 
   g_signal_handlers_disconnect_by_func (priv->volume_monitor, update_places, widget);
+  g_signal_handlers_disconnect_by_func (priv->network_monitor, update_places, widget);
 
   g_cancellable_cancel (priv->cancellable);
   g_cancellable_cancel (priv->networks_fetching_cancellable);
@@ -417,6 +419,7 @@ gtk_places_view_finalize (GObject *object)
   g_clear_object (&priv->server_list_file);
   g_clear_object (&priv->server_list_monitor);
   g_clear_object (&priv->volume_monitor);
+  g_clear_object (&priv->network_monitor);
   g_clear_object (&priv->cancellable);
   g_clear_object (&priv->networks_fetching_cancellable);
   g_clear_object (&priv->path_size_group);
@@ -898,6 +901,40 @@ update_network_state (GtkPlacesView *view)
     }
 }
 
+static void
+monitor_network (GtkPlacesView *self)
+{
+  GtkPlacesViewPrivate *priv;
+  GFile *network_file;
+  GError *error;
+
+  priv = gtk_places_view_get_instance_private (self);
+
+  if (priv->network_monitor)
+    return;
+
+  error = NULL;
+  network_file = g_file_new_for_uri ("network:///");
+  priv->network_monitor = g_file_monitor (network_file,
+                                          G_FILE_MONITOR_NONE,
+                                          NULL,
+                                          &error);
+
+  g_clear_object (&network_file);
+
+  if (error)
+    {
+      g_warning ("Error monitoring network: %s", error->message);
+      g_clear_error (&error);
+      return;
+    }
+
+  g_signal_connect_swapped (priv->network_monitor,
+                            "changed",
+                            G_CALLBACK (update_places),
+                            self);
+}
+
 static void
 populate_networks (GtkPlacesView   *view,
                    GFileEnumerator *enumerator,
@@ -971,6 +1008,7 @@ network_enumeration_next_files_finished (GObject      *source_object,
   if (!priv->destroyed)
     {
       update_network_state (view);
+      monitor_network (view);
       update_loading (view);
     }
 }